// 第一题
// 理解密集数组和稀疏数组的区别和特性

// 1、概念
// 密集数组是每一个位置都有对应索引和值(数组本质是对象,所以每个索引也是对象的key 可以用in判断)
let arr1 = [1, 2, 3];
// 稀疏数组有些位置内存空间被预留但是却没有对应的值和索引(数组长度是连续的内存空间)
let arr2 = [2, 3, 4];
arr2[8] = 8;
// arr2 => [2, 3, 4, empty × 5, 8] 
// arr2.length => 9 



// 2、区别
// 必须注意的是filter、map、forEach等方法是无法过滤除稀疏数组的空位置值的
// 因为这些方法内部迭代器迭代过程中 进行了 index in arr 的判断
let arr31 = [4, 5, 6];
arr31[7] = 7;
let arr3 = arr31.filter(i => i === undefined); 
// arr3.length => 0
// arr3 => [] 

let arr41 = [4, 5, 6];
arr41[9] = 9;
let arr4 = arr41.map(i => typeof i); 
// arr4.length => 10
// arr4 => ['number', 'number', 'number', empty × 6, 'number']



// 3 创建特定长度数组的一些方法

let _arr1 = Array(6);// [empty × 6]
let _arr2 = new Array(3);// [empty × 3]
let _arr3 = Array.from({length: 5}, () => {})//  [undefined, undefined, undefined, undefined, undefined]
let _arr4 = Array.call(null, Array(8));// [undefined, undefined, undefined, undefined, undefined...]
let _arr5 = [...Array(4).keys()]//[0, 1, 2, 3]
let _arr6 = Array(6).fill();// [undefined, undefined, undefined, undefined, undefined, undefined]
let _arr7 = Array.from({length: 3}).fill('');//  ['', '', '']
let _arr8 = [...Array(8).values()]; //[undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]